﻿#define _CRT_SECURE_NO_WARNINGS 1

//数值型数据既可以⽤ASCII形式存储，也可以使⽤⼆进制形式存储
//10000    使⽤⼆进制形式存储
//#include<stdio.h>
//int main()
//{
//	FILE* pf = fopen("test.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//写
//	int a = 10000;
//	fwrite(&a, sizeof(int), 1, pf);//二进制写到文件中
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}


//ANSI C 规定使⽤ fopen 函数来打开⽂件， fclose 来关闭⽂件。


//#include<stdio.h>
//
//int main()
//{
//	//打开文件
//	FILE* pfile = fopen("test1.txt", "w");
//	if (pfile != NULL)
//	{
//		//写
//		fputs("abcde", pfile);
//
//		//关闭文件
//		fclose(pfile);
//		pfile = NULL;
//	}
//	else
//	{
//		perror("fopen");
//		return;
//	}
//
//	return 0;
//}


////fputc
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test2.txt", "w");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//写
//	char ch = 0;
//	for (ch = 'a'; ch <= 'z'; ch++)
//	{
//		printf("%c",fputc(ch, pfile));
//	}
//
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fgetc
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test2.txt", "r");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	char ch = 0;
//	while ((ch = fgetc(pfile)) != EOF)
//	{
//		printf("%c", ch);
//	}
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}



////fputs
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test3.txt", "w");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//写
//	fputs("hello clanguage\n", pfile);
//	fputs("hello cpplanguage\n", pfile);
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fgets
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test3.txt", "r");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	char str[20] = { 0 };
//	char str1[20] = { 0 };
//	fgets(str, 20, pfile);
//	fgets(str1, 20, pfile);
//	printf("%s", str);
//	printf("%s", str1);
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fprintf
//#include<stdio.h>
//struct Info
//{
//	char name[20];
//	int age;
//	char sex[5];
//};
//
//int main()
//{
//	struct Info s1 = { "张三",22,"男" };
//
//	FILE* pfile = fopen("test4.txt", "w");
//	if(pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//写
//	fprintf(pfile, "%s %d %s\n", s1.name, s1.age, s1.sex);
//	fprintf(stdout, "%s %d %s\n", s1.name, s1.age, s1.sex);//标准输出流 --- 一般指的是屏幕
//
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fscanf
//#include<stdio.h>
//
//struct Info
//{
//	char name[20];
//	int age;
//	char sex[5];
//};
//
//int main()
//{
//	struct Info s1 = { 0 };
//	struct Info s2 = { 0 };
//	FILE* pfile = fopen("test4.txt", "r");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	int ret1 = fscanf(pfile, "%s %d %s\n", s1.name, &(s1.age), s1.sex);
//	fprintf(stdout,"%s %d %s\n", s1.name, s1.age, s1.sex);
//	printf("%d \n", ret1);
//
//	int ret2 = fscanf(stdin, "%s %d %s\n", s2.name, &(s2.age), s2.sex);//标准输入流 --- 一般指的是键盘
//	fprintf(stdout, "%s %d %s\n", s2.name, s2.age, s2.sex);
//	printf("%d \n", ret2);
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}



////sprintf/sscanf
//#include<stdio.h>
//
//struct Info
//{
//	char name[20];
//	int age;
//	char sex[5];
//};
//
//int main()
//{
//	struct Info s1 = { "张三",22,"男"};
//
//
//	char str[30] = {0};
//	sprintf(str, "%s %d %s\n", s1.name, s1.age, s1.sex);//写格式化数据到字符串
//	printf("%s", str);
//
//
//	char str1[30] = "李四 23 女";
//	struct Info s2 = {0};
//
//	sscanf(str1, "%s %d %s", s2.name, &(s2.age), s2.sex);//从字符串格式化读取数据
//	printf("%s %d %s\n", s2.name, s2.age, s2.sex);
//
//
//	return 0;
//}



////fwrite
//#include<stdio.h>
//
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	FILE* pfile = fopen("test5.txt", "wb");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//写
//	size_t size = sizeof(arr) / sizeof(int);
//	fwrite(arr, sizeof(int), size, pfile);//以二进制的形式写到文件里面
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}



////fread
//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = {0};
//	FILE* pfile = fopen("test5.txt", "rb");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	size_t size = sizeof(arr) / sizeof(int);
//	fread(arr, sizeof(int), size, pfile);//以二进制的形式读文件里面信息
//	int i = 0;
//	for (i = 0; i < 10; i++)
//		printf("%d ", arr[i]);
//
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fread
//#include<stdio.h>
//
//int main()
//{
//	int arr[10] = { 0 };
//	FILE* pfile = fopen("test5.txt", "rb");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	int i = 0;
//	while (fread(&arr[i], sizeof(int), 1, pfile))//每次读取一个元素
//	{
//		printf("%d ", arr[i]);
//		i++;
//	}
//
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////fseek  ftell   rewind
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test6.txt", "r");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	char ch = fgetc(pfile);
//	printf("%c\n", ch);
//
//	fseek(pfile, 2, SEEK_SET);
//	printf("%c\n", fgetc(pfile));
//	fseek(pfile, 0, SEEK_CUR);
//	printf("%c\n", fgetc(pfile));
//	fseek(pfile, -1, SEEK_END);
//	printf("%c\n", fgetc(pfile));
//
//	size_t pos = ftell(pfile);
//	printf("起始位置的偏移量:%d\n", pos);
//
//	rewind(pfile);//让文件指针回到起始位置
//	size_t pos1 = ftell(pfile);
//	printf("起始位置的偏移量:%d\n", pos1);
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}



//⽂件读取结束的判定
//feof 的作⽤是：当⽂件读取结束的时候，判断是读取结束的原因是否是：遇到⽂件尾结束。


//⽂本⽂件读取是否结束，判断返回值是否为 EOF （ fgetc ），或者 NULL （ fgets ）
//例如：
//• fgetc 判断是否为 EOF .
//• fgets 判断返回值是否为 NULL .
//⼆进制⽂件的读取结束判断，判断返回值是否⼩于实际要读的个数。
//例如：
//• fread判断返回值是否⼩于实际要读的个数。

//#include<stdio.h>
//
//int main()
//{
//	FILE* pfile = fopen("test7.txt", "r");
//	if (pfile == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//
//	//读
//	char ch = 0;
//	while ((ch = fgetc(pfile)) != EOF)
//	{
//		printf("%c", ch);
//	}
//	printf("\n");
//
//	if (feof(pfile))
//	{
//		printf("遇到文件尾结束,读取正常结束\n");
//	}
//	else if (ferror(pfile))
//	{
//		perror("ferror");
//	}
//
//	//关闭文件
//	fclose(pfile);
//	pfile = NULL;
//
//	return 0;
//}


////拷贝文件:test8.txt  ---> test9.txt
//#include<stdio.h>
//
//int main()
//{
//	//打开文件
//	FILE* pfin = fopen("test8.txt", "r");
//	if (pfin == NULL)
//	{
//		perror("fopen test8");
//		return;
//	}
//
//	FILE* pfout = fopen("test9.txt", "w");
//	if (pfout == NULL)
//	{
//		fclose(pfin);
//		perror("fopen test9");
//		return;
//	}
//
//	//读取一个文件信息写入到另一个文件
//	char ch = 0;
//	while ((ch = fgetc(pfin)) != EOF)
//	{
//		fputc(ch, pfout);
//	}
//
//	//关闭文件
//	fclose(pfin);
//	fclose(pfout);
//	pfin = pfout = NULL;
//
//	return 0;
//}






//⽂件缓冲区

#include <stdio.h>
#include <windows.h>

//VS2022 WIN10环境测试
int main()
{
	FILE* pfile = fopen("test10.txt", "w");
	fputs("abcdef", pfile);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了，打开test10.txt文件，发现文件没有内容\n");
	Sleep(10000);

	printf("刷新缓冲区\n");
	fflush(pfile);//刷新缓冲区时，才将输出缓冲区的数据写到⽂件（磁盘）
	//注：fflush 在⾼版本的VS上不能使⽤了

	printf("再睡眠10秒-此时，再次打开test10.txt文件，文件有内容了\n");
	Sleep(10000);

	fclose(pfile);
	//注：fclose在关闭⽂件的时候，也会刷新缓冲区
	pfile = NULL;
	return 0;
}

//因为有缓冲区的存在，C语⾔在操作⽂件的时候，需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做，可能导致读写⽂件的问题。


